package search.local;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.apache.log4j.Logger;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import study.itwill.common.Util;
import study.itwill.common.XmlParser;

public class LocalLoader {
	
	static Logger logger = Logger.getLogger(LocalLoader.class);
	
	public ArrayList<LocalItem> getLocalList(String keyword) {
		
		logger.debug("=========== method start >> getLocalList");

		ArrayList<LocalItem> list = null;

		// URL의 한글 부분에 대한 인코딩 처리
		try {
			keyword = URLEncoder.encode(keyword, "utf-8");
		} catch (UnsupportedEncodingException e) {			
			// 처리 실패이므로, null 리턴
			logger.error("encoding error >> " + e.getLocalizedMessage());
			return null;
		}

		// 네이버 이미지 검색 URL
		String url = "http://openapi.naver.com/search"
				+ "?key="
				+ "83094044549bcd85ea2214d754f913f1"
				+ "&query="
				+ keyword
				+ "&target=local"
				+ "&start=1"
				+ "&display=10";

		/************ XML 데이터 처리 시작 ***********/

		XmlPullParser parser = XmlParser.getParser(url);
		
		if (parser == null) {
			logger.error("xml parser is null");
			// 통신 실패이므로 null 리턴
			return null;
		}
		
		// 통신 성공시 ArrayList 객체 할당
		list = new ArrayList<LocalItem>();
		
		try {
			String tag = null;
			int type = parser.getEventType();

			// --------------------------------------------------------
			/** 읽은 내용을 담기 위한 변수 */
			String title = null;
			String mapx = null;
			String mapy = null;
			String address = null;
			// --------------------------------------------------------

			while (type != XmlPullParser.END_DOCUMENT) {
				tag = parser.getName();

				switch (type) {
				case XmlPullParser.START_TAG:
					// --------------------------------------------------------
					/** 원하는 종류의 시작태그를 만났을 때, 값을 추출 */
					if (tag.equals("title")) {
						parser.next();
						title = parser.getText().trim();
						title = Util.removeTag(title);
					} else if (tag.equals("mapx")) {
						parser.next();
						mapx = parser.getText().trim();
					} else if (tag.equals("mapy")) {
						parser.next();
						mapy = parser.getText().trim();
						// HTML태그 제거
						// description = Util.removeTag(description);
					} else if (tag.equals("address")) {
						parser.next();
						address = parser.getText().trim();
					}
					// --------------------------------------------------------
					break;

				case XmlPullParser.END_TAG:
					// --------------------------------------------------------
					/** 데이터의 그룹단위를 표현하는 태그가 종료되었을 때, 데이터 수집 */
					if (tag.equals("item")) {
						LocalItem item = new LocalItem(title, mapx, mapy, address);
						list.add(item);
					}
					// --------------------------------------------------------
					break;
				}

				type = parser.next();
			}
		} catch (XmlPullParserException e) {
			logger.error("파서 생성 실패 >> " + e.toString());
		} catch (IOException e) {
			logger.error("파서 읽기 실패 >> " + e.toString());
		}
		/************ XML 데이터 처리 끝 ***********/
		

		logger.debug("=========== method end >> getLocalList");

		return list;
	}
}
